package algo3.algothief.modelo;
  
import java.util.ArrayList;
 
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;


public class Posicion {
  
	private double coordenadaX;
	private double coordenadaY;
	
//-------------------------------------------------------------------------------------
	
	public Posicion(double x, double y) {
		coordenadaX = x;
		coordenadaY = y;
	}
 
//-------------------------------------------------------------------------------------

	// La forma de serializar esta escrita lo mas generica posible.

	public Element serializar(Document doc) {
		Element elementoPosicion = doc.createElement("PosicionDeLaCapital");

		ArrayList<String[]> coordenadas = this.juntarCoordenadas();
		int cantidadDeCoordenadas = coordenadas.size();
		for (int i = 0; i < cantidadDeCoordenadas; i++) {
			String[] coordenada = coordenadas.get(i);
			elementoPosicion.appendChild(this.agregarCoordenada(doc,coordenada));
		}
		return elementoPosicion;
	}

	public static Posicion hidratar(Document doc) {
		Element elementoPosicion = (Element)doc.getElementsByTagName("PosicionDeLaCapital").item(0);
		
		NodeList elementosCoordenadas = elementoPosicion.getElementsByTagName("Coordenada");
		
		String coordenadaEnX = ((Element)elementosCoordenadas.item(0)).getAttribute("enX");
		String coordenadaEnY = ((Element)elementosCoordenadas.item(1)).getAttribute("enY");
		Double coordenadaX = Double.parseDouble(coordenadaEnX);
		Double coordenadaY = Double.parseDouble(coordenadaEnY);
		return new Posicion(coordenadaX, coordenadaY);
	}

//-------------------------------------------------------------------------------------
	
	private ArrayList<String[]> juntarCoordenadas() {
		ArrayList<String[]> coordenadas = new ArrayList<String[]>();
		
		String[] enX = { "enX", Double.toString(this.coordenadaX) };
		String[] enY = { "enY", Double.toString(this.coordenadaY) };

		coordenadas.add(enX);
		coordenadas.add(enY);
	
		return coordenadas;
	}

	private Node agregarCoordenada(Document doc, String[] coordenada) {
		Element elementoCoordenada = doc.createElement("Coordenada");
		elementoCoordenada.setAttribute(coordenada[0], coordenada[1]);
		return elementoCoordenada;
	}

//-------------------------------------------------------------------------------------

	public double[] verUbicacion() {
		double[] ubicacion = { coordenadaX, coordenadaY };
		return ubicacion;
	}
 
	public double verCoordenadaX() {
		return coordenadaX;
	}
 
    public double verCoordenadaY() {
    	return coordenadaY;
    }
 
    public double distancia(Posicion otraPosicion) {
    	double[] ubicacionPartida = verUbicacion(); // En km
    	double[] ubicacionLlegada = otraPosicion.verUbicacion(); // En km

    	double x0 = ubicacionPartida[0]; 
    	double y0 = ubicacionPartida[1];
    	double xf = ubicacionLlegada[0];
    	double yf = ubicacionLlegada[1];
    	
    	double distancia = Math.sqrt( Math.pow((xf-x0),2) + Math.pow((yf-y0),2) );
    	
    	return distancia;
    }
} 

